版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2015/06/02/Spring MVC 之 RequestMapping(1)/
一、从@AutoWaired开始
在@AutoWaired中有下面的一段代码,其中populateBean负责属性的加载。而initializeBean完成属性属性加载后的自定义操作。
|
|
来看一下initializeBean的实现。
接着看下invokeInitMethods方法的实现。在
接着看一下RequestMappingHandlerMapping的afterPropertySet方法。会进入AbstractHandlerMethodMapping中的initHandlerMethods方法,如下。该方法扫描ApplicationContext中的beans,检测并注册处理器方法。
二、detectHandlerMethods
展开上一节中的detectHandlerMethods。一共分为以下步骤。
1)遍历Handler中的所有方法,找出其中被@RequestMapping注解标记的方法。
2)然后遍历这些方法,生成RequestMappingInfo实例。
3)将RequestMappingInfo实例以及处理器方法注册到缓存中。
展开getMappingForMethod。这一步根据注解生成RequestMappingInfo。
展开createRequestMappingInfo。
其中涉及到了几个类,我们大致了解下含义:
PatternRequestCondition 它其实就是URL模式的封装,它包含了一个URL模式的Set集合。其实就是@RequestMapping注解中的value值得封装;
RequestMethodRequestCondition 它是@RequestMapping 注解中method属性的封装;
ParamsRequestCondition 它是@RequestMapping注解中params属性的封装;
等等,依次类推。因此RequestMappingInfo其实就是对@RquestMapping 的封装。
生成了RequestMappingInfo 对每一个元素都进行combine操作,不再详细讲解。
再回到本节第一个方法中的registerHandlerMethod方法。这个方法就是生成新的HandlerMethod实例,然后加入handlerMethods中,接着生成mapping中所有的url放入urlMap中。当请求到达时,去urlMap中需找匹配的url,以及获取对应mapping实例,然后去handlerMethods中获取匹配HandlerMethod实例。
接着会分析Spring怎样处理客户发来的请求。